<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace User\Model;

use Think\Model;

/**
 * 会员模型
 */
class UcenterMemberModel extends Model
{

    /**
     * 数据表前缀
     * 
     * @var string
     */
    protected $tablePrefix = UC_TABLE_PREFIX;

    /**
     * 数据库连接
     * 
     * @var string
     */
    protected $connection = UC_DB_DSN;

    /* 用户模型自动验证 */
    protected $_validate = array(
		/* 验证用户名 */
		array(
            'username',
            '1,30',
            - 1,
            self::EXISTS_VALIDATE,
            'length'
        ), // 用户名长度不合法
        array(
            'username',
            'checkDenyMember',
            - 2,
            self::EXISTS_VALIDATE,
            'callback'
        ), // 用户名禁止注册
        array(
            'username',
            '',
            - 3,
            self::EXISTS_VALIDATE,
            'unique'
        ), // 用户名被占用
        
        /* 验证密码 */
        array(
            'password',
            '6,30',
            - 4,
            self::EXISTS_VALIDATE,
            'length'
        ), // 密码长度不合法
        
        /* 验证邮箱 */
        array(
            'email',
            'email',
            - 5,
            self::EXISTS_VALIDATE
        ), // 邮箱格式不正确
        array(
            'email',
            '1,32',
            - 6,
            self::EXISTS_VALIDATE,
            'length'
        ), // 邮箱长度不合法
        array(
            'email',
            'checkDenyEmail',
            - 7,
            self::EXISTS_VALIDATE,
            'callback'
        ), // 邮箱禁止注册
        array(
            'email',
            '',
            - 8,
            self::EXISTS_VALIDATE,
            'unique'
        ), // 邮箱被占用
        
        /* 验证手机号码 */
        array(
            'mobile',
            '//',
            - 9,
            self::EXISTS_VALIDATE
        ), // 手机格式不正确 TODO:
        array(
            'mobile',
            'checkDenyMobile',
            - 10,
            self::EXISTS_VALIDATE,
            'callback'
        ), // 手机禁止注册
        array(
            'mobile',
            '',
            - 11,
            self::EXISTS_VALIDATE,
            'unique'
        )
    ) // 手机号被占用
;

    /* 用户模型自动完成 */
    protected $_auto = array(
        array(
            'password',
            'think_ucenter_md5',
            self::MODEL_BOTH,
            'function',
            UC_AUTH_KEY
        ),
        array(
            'reg_time',
            NOW_TIME,
            self::MODEL_INSERT
        ),
        array(
            'reg_ip',
            'get_client_ip',
            self::MODEL_INSERT,
            'function',
            1
        ),
        array(
            'update_time',
            NOW_TIME
        ),
        array(
            'status',
            'getStatus',
            self::MODEL_BOTH,
            'callback'
        )
    );

    /**
     * 检测用户名是不是被禁止注册
     * 
     * @param string $username
     *            用户名
     * @return boolean ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMember($username)
    {
        return true; // TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测邮箱是不是被禁止注册
     * 
     * @param string $email
     *            邮箱
     * @return boolean ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyEmail($email)
    {
        return true; // TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测手机是不是被禁止注册
     * 
     * @param string $mobile
     *            手机
     * @return boolean ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMobile($mobile)
    {
        return true; // TODO: 暂不限制，下一个版本完善
    }

    /**
     * 根据配置指定用户状态
     * 
     * @return integer 用户状态
     */
    protected function getStatus()
    {
        return true; // TODO: 暂不限制，下一个版本完善
    }

    /**
     * 注册一个新用户
     * 
     * @param string $username
     *            用户名
     * @param string $password
     *            用户密码
     * @param string $email
     *            用户邮箱
     * @param string $mobile
     *            用户手机号码
     * @return integer 注册成功-用户信息，注册失败-错误编号
     */
    public function register($username, $password, $email, $mobile)
    {
        $data = array(
            'username' => $username,
            'password' => $password,
            'email' => $email,
            'mobile' => $mobile
        );
        
        // 验证手机
        if (empty($data['mobile']))
            unset($data['mobile']);
            
            /* 添加用户 */
        if ($this->create($data)) {
            $uid = $this->add();
            return $uid ? $uid : 0; // 0-未知错误，大于0-注册成功
        } else {
            return $this->getError(); // 错误详情见自动验证注释
        }
    }

    /**
     * 用户登录认证
     * 
     * @param string $username
     *            用户名
     * @param string $password
     *            用户密码
     * @param integer $type
     *            用户名类型 （1-用户名，2-邮箱，3-手机，4-UID）
     * @return integer 登录成功-用户ID，登录失败-错误编号
     */
    public function login($username, $password, $type = 1)
    {
        $map = array();
        switch ($type) {
            case 1:
                $map['username'] = $username;
                break;
            case 2:
                $map['email'] = $username;
                break;
            case 3:
                $map['mobile'] = $username;
                break;
            case 4:
                $map['id'] = $username;
                break;
            default:
                return 0; // 参数错误
        }
        
        /* 获取用户数据 */
        $user = $this->where($map)->find();
        if (is_array($user) && $user['status']) {
            /* 验证用户密码 */
            if (think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']) {
                $this->updateLogin($user['id']); // 更新用户登录信息
                return $user['id']; // 登录成功，返回用户ID
            } else {
                return - 2; // 密码错误
            }
        } else {
            return - 1; // 用户不存在或被禁用
        }
    }

    /**
     * 获取用户信息
     * 
     * @param string $uid
     *            用户ID或用户名
     * @param boolean $is_username
     *            是否使用用户名查询
     * @return array 用户信息
     */
    public function info($uid, $is_username = false)
    {
        $map = array();
        if ($is_username) { // 通过用户名获取
            $map['username'] = $uid;
        } else {
            $map['id'] = $uid;
        }
        
        $user = $this->where($map)
            ->field('id,username,email,mobile,status')
            ->find();
        if (is_array($user) && $user['status'] == 1) {
            return array(
                $user['id'],
                $user['username'],
                $user['email'],
                $user['mobile']
            );
        } else {
            return - 1; // 用户不存在或被禁用
        }
    }

    /**
     * 检测用户信息
     * 
     * @param string $field
     *            用户名
     * @param integer $type
     *            用户名类型 1-用户名，2-用户邮箱，3-用户电话
     * @return integer 错误编号
     */
    public function checkField($field, $type = 1)
    {
        $data = array();
        switch ($type) {
            case 1:
                $data['username'] = $field;
                break;
            case 2:
                $data['email'] = $field;
                break;
            case 3:
                $data['mobile'] = $field;
                break;
            default:
                return 0; // 参数错误
        }
        
        return $this->create($data) ? 1 : $this->getError();
    }

    /**
     * 更新用户登录信息
     * 
     * @param integer $uid
     *            用户ID
     */
    protected function updateLogin($uid)
    {
        $data = array(
            'id' => $uid,
            'last_login_time' => NOW_TIME,
            'last_login_ip' => get_client_ip(1)
        );
        $this->save($data);
    }

    /**
     * 更新用户信息
     * 
     * @param int $uid
     *            用户id
     * @param string $password
     *            密码，用来验证
     * @param array $data
     *            修改的字段数组
     * @return true 修改成功，false 修改失败
     * @author huajie <banhuajie@163.com>
     */
    public function updateUserFields($uid, $password, $data)
    {
        if (empty($uid) || empty($password) || empty($data)) {
            $this->error = '参数错误！';
            return false;
        }
        
        // 更新前检查用户密码
        if (! $this->verifyUser($uid, $password)) {
            $this->error = '验证出错：密码不正确！';
            return false;
        }
        
        // 更新用户信息
        $data = $this->create($data);
        if ($data) {
            return $this->where(array(
                'id' => $uid
            ))->save($data);
        }
        return false;
    }

    /**
     * 验证用户密码
     * 
     * @param int $uid
     *            用户id
     * @param string $password_in
     *            密码
     * @return true 验证成功，false 验证失败
     * @author huajie <banhuajie@163.com>
     */
    protected function verifyUser($uid, $password_in)
    {
        $password = $this->getFieldById($uid, 'password');
        if (think_ucenter_md5($password_in, UC_AUTH_KEY) === $password) {
            return true;
        }
        return false;
    }
}
